from datetime import datetime
from typing import List, Optional
from pydantic import BaseModel


class User(BaseModel):
    id: int         # id需要一个整型，必须字段
    name: int = 'John Doe'
    signup_ts: Optional[datetime] = None
    friends: List[int] = []


# 模拟了一个从前端传递过来的数据
# 这个数据不是很友好，比如id的类型应该是int，但是这里传递了str
# friends应该是int，但是其中混杂了一个str
# signup_ts应该是datetime，但是这里是str
external_data = {
    'id': '123',
    'signup_ts': '2019-06-01 12:22',
    'friends': [1, 2, '3'],
}


# **：打散，类似于前端的解构
# 会尝试做自动转换。比如这里id要求是int，但是传入的是字符串123，则会尝试将字符串转为int
# friends也一样，会自动转换
# 如果转换失败会怎样？
user = User(**external_data)
print(user.id)
# repr：查看原始数据格式
print(repr(user.signup_ts))
print(user.friends)
# dict()：把python对象转换成字典
print(user.dict())
